//package com.piesat.quake.business.device.mqtt.decoder;
//
//import com.piesat.quake.business.device.mqtt.DataType;
//import com.piesat.quake.business.device.mqtt.param.ClassParseParam;
//import com.piesat.quake.business.device.mqtt.param.ListParseParam;
//import com.piesat.quake.business.device.mqtt.param.ParseParam;
//import com.piesat.quake.business.device.mqtt.reader.Reader;
//
//import java.lang.reflect.Constructor;
//import java.lang.reflect.Field;
//import java.util.HashMap;
//import java.util.LinkedList;
//import java.util.List;
//import java.util.Map;
//
//import io.netty.buffer.ByteBuf;
//import io.netty.buffer.Unpooled;
//
///**
// * MQTT数据解析器功能
// *
// * @author Gersy
// * @date 2023/2/6
// * @since 1.0
// */
//public class MessageDecoder {
//
//    public <T> List<T> decodeList(Class<T> clazz, ByteBuf byteBuf, List<? extends ParseParam> parseParams, int length) {
//        List<T> list = new LinkedList<>();
//        int perLength = 0;
//        for (ParseParam parseParam : parseParams) {
//            perLength += parseParam.getLength();
//        }
//        int total = 0;
//        while (total <= length) {
//            list.add(decode(clazz, byteBuf, parseParams));
//            total += perLength;
//        }
//        return list;
//    }
//
//    public <T> T decode(Class<T> clazz, byte[] bytes, List<? extends ParseParam> parseParams) {
//        return decode(clazz, bytes, parseParams, null);
//    }
//
//    public <T> T decode(Class<T> clazz, byte[] bytes, List<? extends ParseParam> parseParams, Map<String, Field> fieldMap) {
//        ByteBuf byteBuf = Unpooled.copiedBuffer(bytes);
//        return decode(clazz, byteBuf, parseParams, fieldMap);
//    }
//
//    private <T> T decode(Class<T> clazz, ByteBuf byteBuf, List<? extends ParseParam> parseParams) {
//        return decode(clazz, byteBuf, parseParams, null);
//    }
//
//    /**
//     * 解析为对象
//     *
//     * @param clazz 对象的Class
//     * @param bytes 待解析的MQTT报文
//     * @param parseParams 解析的参数配置文件
//     * @param <T> 数据的泛型
//     */
//    private <T> T decode(Class<T> clazz, ByteBuf byteBuf, List<? extends ParseParam> parseParams, Map<String, Field> fieldMap) {
//        try {
//            Constructor<?> constructor = clazz.getConstructor();
//            Object o = constructor.newInstance();
//            for (ParseParam parseParam : parseParams) {
//                Field field = getField(clazz, fieldMap, parseParam);
//                field.setAccessible(true);
//                if (parseParam instanceof ListParseParam) {
//                    ListParseParam param = (ListParseParam) parseParam;
//                    List<?> objects = decodeList(param.clazz, byteBuf, param.parseParams,32);
//                    field.set(o, objects);
//                } else if (parseParam instanceof ClassParseParam) {
//                    ClassParseParam param = (ClassParseParam) parseParam;
//                    Object decode = decode(param.clazz, byteBuf, param.parseParams, fieldMap);
//                    field.set(o, decode);
//                } else {
//                    Reader reader = DataType.getReader(parseParam.type);
//                    field.set(o, reader.read(byteBuf, parseParam));
//                }
//            }
//            return (T) o;
//        } catch (Exception e) {
//            throw new RuntimeException("解析失败：" + e.getMessage());
//        }
//    }
//
//    private <T> Field getField(Class<T> clazz, Map<String, Field> fieldMap, ParseParam parseParam) throws NoSuchFieldException {
//        Field field = null;
//        if (fieldMap != null) {
//            field = fieldMap.get(parseParam.field);
//        }
//        if (field == null) {
//            field = clazz.getDeclaredField(parseParam.field);
//        }
//        return field;
//    }
//
//    /**
//     * 将数据解析为Map
//     *
//     * @param bytes 待解析的MQTT报文
//     * @param parseParams 解析的参数配置文件
//     */
//    public Map<String, Object> decode(byte[] bytes, List<? extends ParseParam> parseParams) {
//        ByteBuf byteBuf = Unpooled.copiedBuffer(bytes);
//        HashMap<String, Object> map = new HashMap<>();
//        for (ParseParam parseParam : parseParams) {
//            Reader reader = DataType.getReader(parseParam.type);
//            map.put(parseParam.field, reader.read(byteBuf, parseParam));
//        }
//        return map;
//    }
//
//}
